/***************************************************************************\
 * The Mattise Kernel														*
 * Copyright 2007 Matthew Iselin											*
 * Licensed under the GPL													*
 *																			*
 * cpu.h																	*
 *																			*
 * CPU Identification, and utilities for getting the information once it's	*
 * already gotten.															*
 *																			*
\***************************************************************************/

#ifndef CPU_H
#define CPU_H

// does detection
void CPUIdent();

/*** standard level 1 ***/

struct level1_CPUInfo1
{
	uint_t stepping : 4;
	uint_t model : 4;
	uint_t family : 4;
	uint_t type : 3;
	uint_t extmodel : 4;
	uint_t extfam : 8;
	uint_t buf : 5;
};

struct level1_CPUInfo2
{
	uchar_t brand,clflush,count,apicid;
};

struct level1_FeatureSet1
{
	uint_t sse3 : 1;
	uint_t rsvd : 2;
	uint_t mon : 1;
	uint_t dscpl : 1;
	uint_t vmx : 1;
	uint_t smx : 1;
	uint_t est : 1;
	uint_t tm2 : 1;
	uint_t ssse3 : 1;
	uint_t cid : 1;
	uint_t rsvd2 : 2;
	uint_t cx16 : 1;
	uint_t etprd : 1;
	uint_t pdcm : 1;
	uint_t rsvd3 : 2;
	uint_t dca : 1;
	uint_t sse4_1 : 1;
	uint_t sse4_2 : 1;
	uint_t rsvd4 : 2;
	uint_t popcnt : 1;
	uchar_t rsvd5;
};

struct level1_FeatureSet2
{
	uint_t fpu : 1;
	uint_t vme : 1;
	uint_t de : 1;
	uint_t pse : 1;
	uint_t tsc : 1;
	uint_t msr : 1;
	uint_t pae : 1;
	uint_t mce : 1;
	uint_t cx8 : 1;
	uint_t apic : 1;
	uint_t rsvd : 1;
	uint_t sep : 1;
	uint_t mtrr : 1;
	uint_t pge : 1;
	uint_t mca : 1;
	uint_t cmov : 1;
	uint_t pat : 1;
	uint_t pse36 : 1;
	uint_t psn : 1;
	uint_t clfl : 1;
	uint_t rsvd2 : 1;
	uint_t dtes : 1;
	uint_t acpi : 1;
	uint_t mmx : 1;
	uint_t fxsr : 1;
	uint_t sse : 1;
	uint_t sse2 : 1;
	uint_t ss : 1;
	uint_t htt : 1;
	uint_t tm1 : 1;
	uint_t ia64 : 1;
	uint_t pbe : 1;
};

struct CPUID_Info {
	struct level1_CPUInfo1 cpuinfo1;
	struct level1_CPUInfo2 cpuinfo2;
	struct level1_FeatureSet1 features1;
	struct level1_FeatureSet2 features2;
};

// gets the cpu info
void GetCPUInfo( struct CPUID_Info* );

#endif
